macro 是 dbt 中非常重要的功能。本文以及後續幾篇文章將深入探討 dbt 中的 macro,包括其基本概念、使用場景、內建 macro 以及如何用 macro 管理 BigQuery UDF。
在 dbt 中,macro 是由 Jinja 語言和 SQL 結合而成的可重用代碼片段。Jinja 是一個專為 Python 設計的模板引擎,主要用於網頁開發和生成動態內容。
dbt 選擇使用 Jinja 是因為其強大的模板功能能使 SQL 代碼更加靈活和可重用,這正是數據轉換過程中經常需要的特性。Jinja 具有以下幾個特點:
以下是使用 Jinja 生成 HTML 的範例:
<!DOCTYPE html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>{{ heading }}</h1>
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</body>
</html>
from jinja2 import Environment, FileSystemLoader
# 設定 Jinja 環境和模板位置
env = Environment(loader=FileSystemLoader('templates'))
template = env.get_template('example.html')
# 資料
data = {
'title': '範例頁面',
'heading': '歡迎來到我的網站',
'items': ['Python', 'Jinja', '模板引擎']
}
# 套用模板
output = template.render(data)
print(output)
就可以生成以下的內容
<!DOCTYPE html>
<html>
<head>
<title>範例頁面</title>
</head>
<body>
<h1>歡迎來到我的網站</h1>
<ul>
<li>Python</li>
<li>Jinja</li>
<li>模板引擎</li>
</ul>
</body>
</html>
dbt 使用 Jinja 結合 SQL 來構建可重複使用的函式,這些函式稱為 macro,可被其他 macros 和 models 調用。(Jinja 也可直接用於 models 中)
以下情境適合考慮將 SQL 語法打包成 macro:
以上就是 macro 的簡介。下一篇文章將詳細介紹如何將上述情境寫成 macro。
https://docs.getdbt.com/docs/build/jinja-macros